package com.xyq.system.service.question;

import cn.hutool.core.bean.BeanUtil;
import com.github.pagehelper.PageHelper;
import com.xyq.common.core.exception.ServiceException;
import com.xyq.system.domain.question.Question;
import com.xyq.system.domain.question.dto.QuestionAddDTO;
import com.xyq.system.domain.question.dto.QuestionEditDTO;
import com.xyq.system.domain.question.dto.QuestionSelectDTO;
import com.xyq.system.domain.question.es.QuestionES;
import com.xyq.system.domain.question.vo.QuestionDetailVO;
import com.xyq.system.domain.question.vo.QuestionVO;
import com.xyq.system.elasticsearch.QuestionRepository;
import com.xyq.system.manager.QuestionCacheManager;
import com.xyq.system.mapper.question.QuestionMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

import static com.xyq.common.core.enums.ResultCode.FAILED_NOT_EXISTS;

@Service
public class QuestionServiceImpl implements QuestionService{

     @Autowired
     private QuestionMapper questionMapper ;

     @Autowired
     private QuestionRepository questionRepository ;

     @Autowired
     private QuestionCacheManager questionCacheManager ;

    @Override
    public List<QuestionVO> list(QuestionSelectDTO questionSelectDTO) {
        // 加入这条语句就足够可以实现 分页查询功能
        PageHelper.startPage(questionSelectDTO.getPageNum() , questionSelectDTO.getPageSize());
        return  questionMapper.selectQuestionList(questionSelectDTO) ;
    }

    @Override
    public boolean add(QuestionAddDTO questionAddDTO) {
         // 通过 dto来构造 题库表的实体类 Question
        Question question = new Question() ;
        // 使用hutool工具包里的工具, 把dto里的数据复制给 question
        BeanUtil.copyProperties(questionAddDTO , question);
        // 插入数据
        //先插入数据库,在添加ES
        int insert = questionMapper.insert(question);
        if(insert <= 0 ){
            return false ;
        }
        QuestionES questionES = new QuestionES() ;
        BeanUtil.copyProperties(question , questionES);
        // 插入ES  插入需要 id , 所以 先插入了数据库获取自增id
        questionRepository.save(questionES) ;

        // 把题目也添加到 redis 题目列表中
        questionCacheManager.addCache(question.getQuestionId());

        return true;
    }

    @Override
    public QuestionDetailVO detail(Long questionId) {
        Question question = questionMapper.selectById(questionId);
        // 判断在不在数据库里
        if(question == null){   // 如果没有这个题目,就抛一个资源不存在的异常
            throw new ServiceException(FAILED_NOT_EXISTS);  //让统一异常处理处理异常
        }
        // 如果存在, 就 把question复制给vo , 返回vo
        QuestionDetailVO questionVO = new QuestionDetailVO() ;
        // 通过 hutool工具包复制
        BeanUtil.copyProperties(question, questionVO);
        return questionVO ;
    }

    @Override
    public int edit(QuestionEditDTO questionEditDTO) {
        // 查看当前题目是否存在
        Question old = questionMapper.selectById(questionEditDTO.getQuestionId());
        // 判断在不在数据库里
        if(old == null){   // 如果没有这个题目,就抛一个资源不存在的异常
            throw new ServiceException(FAILED_NOT_EXISTS);  //让统一异常处理处理异常
        }
        old.setTitle(questionEditDTO.getTitle());
        old.setContent(questionEditDTO.getContent());
        old.setDifficulty(questionEditDTO.getDifficulty());
        old.setDefaultCode(questionEditDTO.getDefaultCode());
        old.setQuestionCase(questionEditDTO.getQuestionCase());
        old.setMainFuc(questionEditDTO.getMainFuc());
        old.setSpaceLimit(questionEditDTO.getSpaceLimit());
        old.setSpaceLimit(questionEditDTO.getSpaceLimit());   // 因为通过MyBatisplus进行了 更新填充, 所以不需要修改
                                                              // updateBy 和 updateTime 会自动更新
         // 修改ES中的数据
        QuestionES questionES = new QuestionES() ;
        BeanUtil.copyProperties(old , questionES);
        questionRepository.save(questionES);
        return questionMapper.updateById(old) ;   // 通过自己的id进行更新
    }

    @Override
    public int delete(Long questionId) {
        Question question = questionMapper.selectById(questionId);
        if(question == null){   // 如果没有这个题目,就抛一个资源不存在的异常
            throw new ServiceException(FAILED_NOT_EXISTS);  //让统一异常处理处理异常
        }
         // 删除ES里的题目
        questionRepository.deleteById(questionId);
        // 删除redis里的缓存
        questionCacheManager.removeCache(questionId);
        return questionMapper.deleteById(questionId);
    }


}
